#Python 有两种错误很容易辨认：语法错误和异常。
# #1.语法错误
# while True
#     print('Hello world')
# #产生错误是因为缺少了一个冒号

#2.异常
#异常是程序运行时发生的错误
# 10 * (1/0)             # 0 不能作为除数，触发异常
# #Traceback (most recent call last):ZeroDivisionError: division by zero
# 4 + spam*3             # spam 未定义，触发异常
# #Traceback (most recent call last):NameError: name 'spam' is not defined
#  '2' + 2               # int 不能与 str 相加，触发异常
# #Traceback (most recent call last):TypeError: can only concatenate str (not "int") to str

#3.异常处理
while True:
    try:
        x = int(input("请输入一个数字: "))
        break
    except ValueError: #如果没有写异常类型，则默认所有异常都会捕获
        print("您输入的不是数字，请再次尝试输入！")

# 4. 异常处理基本结构 else finally
try:
    # 尝试获取用户输入的数字
    num1 = int(input("请输入第一个数字："))
    num2 = int(input("请输入第二个数字："))
    # 进行除法运算
    result = num1 / num2
    print(f"结果是：{result}")
except ValueError:
    # 处理值错误异常，当用户输入不是有效的整数时触发
    print("输入的不是有效的数字，请重新输入整数。")
except ZeroDivisionError:
    # 处理除零错误异常，当除数为零时触发
    print("除数不能为零，请重新输入第二个数字。")
finally:
    # 无论是否发生异常，finally 块中的代码都会执行
    print("程序执行完毕。")


#5. assert 断言 抛出异常
# assert 5<3   #判断条件为False时，抛出异常，默认异常为AssertionError


#6.raise语句
# age=-5
# if age<0:
#     raise ValueError("年龄不能为负数") #抛出异常，异常类型为ValueError
# #与assert不同，raise语句可以抛出任意类型的异常，默认是  Exception 类型

#7.应用异常处理，输入一个正数，计算它的平方根。
import math
while True:
     try:
          n=input("输入一个整数：")
          n=int(n)
          if n<0:
               raise Exception("整数为负数") #如果输入的数小于0，抛出异常
          break
     except Exception as err:    #处理异常
          print("输入错误: ",err)   #如果 n<0，输出异常信息
print(math.sqrt(n))
print("程序结束")



#8.简单异常语句
import math
while True:
     try:
          n=input("请输入一个整数：")
          n=int(n)
          if n<0:
               raise Exception()  #如果输入的数小于0，抛出异常，没有提示信息
          break
     except:  #处理异常，没有指定异常类型
          print("请输入正整数")  #输出提示信息
print(math.sqrt(n))
print("程序结束")
